package com.bms.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author Lan
 */
public class DateUtil {

	public static final String LONG_DATE = "yyyy-MM-dd HH:mm:ss";
	
	public static final String SHORT_DATE = "yyyy-MM-dd";
	/**
	 * 功能描述：以指定的格式来格式化日期
	 * 
	 * @param date
	 *            Date 日期
	 * @param pattern
	 *            String 格式
	 * @return String 日期字符串
	 */
	public static String formatDate(Date date, String pattern) {
		String result = "";
		if (date != null) {
			try {
				DateFormat sdf = new SimpleDateFormat(pattern);
				result = sdf.format(date);
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		return result;
	}
	
	/**
	 * 功能描述：常用的格式化日期
	 * 
	 * @param date
	 *            Date 日期
	 * @return String 日期字符串 yyyy-MM-dd格式
	 */
	public static String formatDate(Date date) {
		return formatDate(date, SHORT_DATE);
	}

	/**
	 * 功能描述：格式化日期
	 * 
	 * @param dateStr
	 *            String 字符型日期
	 * @param pattern
	 *            String 格式
	 * @return Date 日期
	 */
	public static Date parseDate(String dateStr, String pattern) {
		Date date = null;
		try {
			DateFormat dateFormat = new SimpleDateFormat(pattern);
			date = dateFormat.parse(dateStr);
		} catch (Exception e) {
		}
		return date;
	}

	/**
	 * 功能描述：格式化日期
	 * 
	 * @param dateStr
	 *            String 字符型日期：yyyy-MM-dd 格式
	 * @return Date
	 */
	public static Date parseDate(String dateStr) {
		return parseDate(dateStr, SHORT_DATE);
	}

	/**
	 * 功能描述：返回毫秒
	 * 
	 * @param date
	 *            日期
	 * @return 返回毫秒
	 */
	public static long getMillis(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.getTimeInMillis();
	}

	/**
	 * 获取当前时间
	 * 
	 * @author Lan
	 * @param pattern
	 * @return
	 */
	public static String getNowTime(String pattern) {
		Date date = Calendar.getInstance().getTime();
		return formatDate(date, pattern);
	}

	/**
	 * 功能描述：日期相加
	 * 
	 * @param date
	 *            Date 日期
	 * @param day
	 *            int 天数
	 * @return 返回相加后的日期
	 */
	public static Date addDate(Date date, int day) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, day);
		return calendar.getTime();
	}

	/**
	 * 当前日期加减后的日期，以指定的pattern格式返回
	 * 
	 * @author Lan
	 * @param day
	 * @param pattern
	 * @return
	 */
	public static String addDate(int day, String pattern) {
		try {
			Date date = addDate(new Date(), day);
			return formatDate(date, pattern);
		} catch (Exception e) {
			return "";
		}
	}

	/**
	 * 功能描述：日期相减
	 * 
	 * @param date1
	 *            Date 日期
	 * @param date2
	 *            Date 日期
	 * @return 返回相减后的日期
	 */
	public static long diffDate(Date date1, Date date2) {
		return Math.abs((getMillis(date1) - getMillis(date2))
				/ (24 * 3600 * 1000));
	}

	/**
	 * 功能描述：取得指定月份的第一天
	 * 
	 * @param strdate
	 *            String 字符型日期
	 * @return String yyyy-MM-dd 格式
	 */
	public static String getMonthBegin(String strdate) {
		Date date = parseDate(strdate);
		return formatDate(date, "yyyy-MM") + "-01";
	}

	/**
	 * 功能描述：取得指定月份的最后一天
	 * 
	 * @param strdate
	 *            String 字符型日期
	 * @return String 日期字符串 yyyy-MM-dd格式
	 */
	public static String getMonthEnd(String strdate) {
		Date date = parseDate(getMonthBegin(strdate));
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.MONTH, 1);
		calendar.add(Calendar.DAY_OF_YEAR, -1);
		return formatDate(calendar.getTime());
	}

	/**
	 * 获取一天的最后时间 如：Fri Dec 09 23:59:59 CST 2011
	 * @author Lan
	 * @param date
	 * @return
	 */
	public static Date getEndOfDate(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.HOUR_OF_DAY, 23);
		cal.set(Calendar.MINUTE, 59);
		cal.set(Calendar.SECOND, 59);
		return cal.getTime();
	}
	/**
	 * 获取一天的最后时间
	 * @author Lan
	 * @param strDate yyyy-MM-dd
	 * @return
	 */
	public static Date getEndOfDate(String strDate){
		Date date = parseDate(strDate);
		return getEndOfDate(date);
	}
}
